#ifndef YT_FACE_ALIGNMENT_WRAP_H
#define YT_FACE_ALIGNMENT_WRAP_H

#include <vector>
#include <string>
#include <opencv2/core/core.hpp>
#include "YTTrackCommonDefine.h"

#define FACEALIGNMENT_EXPORT __attribute__((visibility("default")))

class YtFaceAlignmentSdk;

namespace yt_backend_facetrackpro{

/************************
 * @brief The YtFaceAlignmentSdk Class: 优图人脸配准sdk
 ************************/
class FACEALIGNMENT_EXPORT YTFaceAlignment
{
public:
    
    YTFaceAlignment();
    ~YTFaceAlignment();
    
    /************************
     * @brief GlobalInit: 全局初始化函数，进程初始化一次即可，多线程不安全
     * @param modelDir: 模型所在目录
     * @return: 0 => 成功
     *          非0 => 失败
     ************************/
    static int GlobalInit(const char *modelDir);
    static int GlobalInit(const std::string &modelDir);
    
    /************************
     * @brief GlobalRelease: 全局析构函数，进程结束析构一次即可，多线程不安全
     ************************/
    static int GlobalRelease();
    /************************
     * @brief Version: sdk版本
     * @return: 版本相关信息
     ************************/
    static std::string Version();
    
    /************************
     * @brief sdk模型文件的md5, 多个模型文件则以空格隔开
     * @return: 模型文件的md5字符串, 如果有多个模型文件则以空格隔开
     ************************/
    static std::string ModelCheckSum();
    
    /************************
     * @brief AlignFace: 人脸配准接口函数，多线程安全(需要每个线程独占一个实例)
     * @param bgr： 输入图像，格式BGR
     * @param faceRect: 输入, 图像内需要配准的人脸的框
     * @param resFaceShape: 输出, 人脸配准关键点结果, 详见TC_FaceShape
     * @param confidence: 输出, 0~1, 为输入区域是人脸的置信度(越接近1越可以肯定是人脸)
     * @param visible: 输出，列向量，对应每个人脸配准点是否可见(越接近1表示可见，越接近0表示被遮挡)
     * @return: 0   : 成功
     *          非0 : 失败
     ************************/
    int AlignFace(const cv::Mat& bgr, const cv::Rect& faceRect, TC_FaceShape& resFaceShape, float& confidence);
    int AlignFace(const cv::Mat& bgr, const cv::Rect& faceRect, TC_FaceShape& resFaceShape, float& confidence, cv::Mat &visible);
    
    /************************
     * @brief AlignFace: 人脸配准接口函数，多线程安全(需要每个线程独占一个实例)
     * @param bgr： 输入图像，格式BGR
     * @param srcFaceShape: 输入, 前一帧的配准结果
     * @param resFaceShape: 输出, 人脸配准关键点结果, 详见TC_FaceShape
     * @param confidence: 输出, 0~1, 为输入区域是人脸的置信度(越接近1越可以肯定是人脸)
     * @param visible: 输出，列向量，对应每个人脸配准点是否可见(越接近1表示可见，越接近0表示被遮挡)
     * @return: 0   : 成功
     *          非0 : 失败
     ************************/
    int AlignFace(const cv::Mat& bgr,const TC_FaceShape& srcFaceShape, TC_FaceShape& resFaceShape, float& confidence);
    int AlignFace(const cv::Mat& bgr,const TC_FaceShape& srcFaceShape, TC_FaceShape& resFaceShape, float& confidence, cv::Mat &visible);
    
    
private:
    YtFaceAlignmentSdk * privateInst;
    
};

}   // namespace

#endif // YT_FACE_ALIGNMENT_H


